# -*- coding: UTF-8 -*-
"""
       cons.py

       Copyright 2009-2014 Giuseppe Penone <giuspen@gmail.com>

       This program is free software; you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published by
       the Free Software Foundation; either version 3 of the License, or
       (at your option) any later version.

       This program is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       GNU General Public License for more details.

       You should have received a copy of the GNU General Public License
       along with this program; if not, write to the Free Software
       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
       MA 02110-1301, USA.
"""
import os
import cherrytree.debug.debug_stuff as debug

# paths
ABS_DIR = os.path.dirname(os.path.realpath(__file__))
debug.debug_output("ABS_DIR = " + str(ABS_DIR), "info", "cons.py", "")
DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "data")  # set data path as gobal ref
debug.debug_output("DATA_DIR = " + str(DATA_DIR), "info", "cons.py", "")
ICON_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "data/icons")  # set data path as gobal ref
debug.debug_output("ICON_DIR = " + str(ICON_DIR), "info", "cons.py", "")

# App info
VERSION = "0.0.1"  # version number of the software
APP_NAME = "cherrytree"  # name of the software

NEWER_VERSION_URL = "http://www.giuspen.com/software/version_cherrytree"  # website for updating the software
LINK_CUSTOM_ACTION_DEFAULT_WEB = "firefox %s &"
LINK_CUSTOM_ACTION_DEFAULT_FILE = "xdg-open %s &"

HORIZONTAL_RULE = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
COLOR_PALETTE_DEFAULT = ["#000000", "#ffffff", "#7f7f7f", "#ff0000", "#a020f0",
                         "#0000ff", "#add8e6", "#00ff00", "#ffff00", "#ffa500",
                         "#e6e6fa", "#a52a2a", "#8b6914", "#1e90ff", "#ffc0cb",
                         "#90ee90", "#1a1a1a", "#4d4d4d", "#bfbfbf", "#e5e5e5"]
SPECIAL_CHARS_DEFAULT = "“”„•☐☑☒…‰€©®™°↓↑→←↔↵⇓⇑⇒⇐⇔»«▼▲►◄≤≥≠±¹²³½¼⅛×÷∞ø∑√∫ΔδΠπΣΦΩωαβγεηλμ☺☻☼♥♀♂♪♫"

try:
    import appindicator
    HAS_APPINDICATOR = True
except ImportError:
    HAS_APPINDICATOR = False

XDG_CURRENT_DESKTOP = 'XDG_CURRENT_DESKTOP'
HAS_SYSTRAY = not (XDG_CURRENT_DESKTOP in os.environ and os.environ[XDG_CURRENT_DESKTOP] == "Unity")

AVAILABLE_LANGS = ['default', 'cs', 'de', 'en', 'es', 'fr', 'hy', 'it', 'nl', 'pl', 'pt_BR', 'ru', 'uk', 'zh_CN']
COLOR_48_LINK_WEBS = "#00004444ffff"
COLOR_48_LINK_NODE = "#071c838e071c"
COLOR_48_LINK_FILE = "#8b8b69691414"
COLOR_48_LINK_FOLD = "#7f7f7f7f7f7f"
COLOR_48_YELLOW = "#bbbbbbbb0000"
COLOR_48_WHITE = "#ffffffffffff"
COLOR_48_BLACK = "#000000000000"
COLOR_24_BLACK = "#000000"
COLOR_24_WHITE = "#ffffff"
COLOR_24_BLUEBG = "#001b33"
COLOR_24_LBLACK = "#0b0c0c"
COLOR_24_GRAY = "#e0e0e0"
RICH_TEXT_DARK_FG = COLOR_24_WHITE
RICH_TEXT_DARK_BG = COLOR_24_BLUEBG
RICH_TEXT_LIGHT_FG = COLOR_24_BLACK
RICH_TEXT_LIGHT_BG = COLOR_24_WHITE
TREE_TEXT_DARK_FG = COLOR_24_WHITE
TREE_TEXT_DARK_BG = COLOR_24_BLUEBG
TREE_TEXT_LIGHT_FG = COLOR_24_LBLACK
TREE_TEXT_LIGHT_BG = COLOR_24_GRAY
BAD_CHARS = "[\x00-\x08\x0b-\x1f]"
GTKSPELLCHECK_TAG_NAME = "gtkspellchecker-misspelled"
TAG_WEIGHT = "weight"
TAG_FOREGROUND = "foreground"
TAG_BACKGROUND = "background"
TAG_STYLE = "style"
TAG_UNDERLINE = "underline"
TAG_STRIKETHROUGH = "strikethrough"
TAG_SCALE = "scale"
TAG_FAMILY = "family"
TAG_JUSTIFICATION = "justification"
TAG_LINK = "link"
TAG_PROP_HEAVY = "heavy"
TAG_PROP_ITALIC = "italic"
TAG_PROP_MONOSPACE = "monospace"
TAG_PROP_SINGLE = "single"
TAG_PROP_TRUE = "true"
TAG_PROP_H1 = "h1"
TAG_PROP_H2 = "h2"
TAG_PROP_H3 = "h3"
TAG_PROP_H4 = "h4"
TAG_PROP_H5 = "h5"
TAG_PROP_H6 = "h6"
TAG_PROP_SUPUPERSCRIPT = "sup"
TAG_PROP_SUBSCRIPT = "sub"
TAG_PROP_LEFT = "left"
TAG_PROP_CENTER = "center"
TAG_PROP_RIGHT = "right"
TAG_PROP_SMALL = "small"

TAG_PROPERTIES = [TAG_WEIGHT, TAG_FOREGROUND, TAG_BACKGROUND, TAG_STYLE, TAG_UNDERLINE,
                  TAG_STRIKETHROUGH, TAG_SCALE, TAG_FAMILY, TAG_JUSTIFICATION, TAG_LINK]
LINK_TYPE_WEBS = "webs"
LINK_TYPE_FILE = "file"
LINK_TYPE_FOLD = "fold"
LINK_TYPE_NODE = "node"
RICH_TEXT_ID = "custom-colors"
PLAIN_TEXT_ID = "plain-text"
STYLE_SCHEME_DEFAULT = "cobalt"

ANCHOR_CHAR = 'icons/anchor.png'
FILE_CHAR = 'icons/file_icon.png'

NODES_ICONS = {0: 'cherry_red', 1: 'cherry_blue', 2: 'cherry_orange', 3: 'cherry_cyan',
               4: 'cherry_orange_dark', 5: 'cherry_sherbert', 6: 'cherry_yellow'}

CODE_ICONS = {"python": 'cherry_green', "sh": 'cherry_purple',
              "c": 'cherry_black', "cpp": 'cherry_black', "chdr": 'cherry_black'}

MAX_FILE_NAME_LEN = 150
WHITE_SPACE_BETW_PIXB_AND_TEXT = 3
GRID_SLIP_OFFSET = 3
MAIN_WIN_TO_TEXT_WIN_NORMALIZER = 50
MAX_RECENT_DOCS = 10
TABLE_DEFAULT_COL_MIN = 40
TABLE_DEFAULT_COL_MAX = 400

CHAR_SPACE = " "
CHAR_NEWLINE = "\n"
CHAR_NEWPAGE = "\x0c"
CHAR_CR = "\r"
CHAR_TAB = "\t"
CHAR_LISTBUL = "•"
CHAR_LISTARR = "►"
CHAR_LISTTODO = "☐"
CHAR_LISTDONEOK = "☑"
CHAR_LISTDONEFAIL = "☒"
CHAR_TILDE = "~"
CHAR_MINUS = "-"
CHAR_DQUOTE = '"'
CHAR_SQUOTE = "'"
CHAR_SLASH = "/"
CHAR_BSLASH = "\\"
CHAR_SQ_BR_OPEN = "["
CHAR_SQ_BR_CLOSE = "]"
CHAR_PARENTH_OPEN = "("
CHAR_PARENTH_CLOSE = ")"
CHAR_LESSER = "<"
CHAR_GREATER = ">"
CHAR_STAR = "*"
CHAR_QUESTION = "?"
CHAR_COMMA = ","
CHAR_COLON = ":"
CHAR_SEMICOLON = ";"
CHAR_USCORE = "_"
CHAR_EQUAL = "="
CHAR_BR_OPEN = "{"
CHAR_BR_CLOSE = "}"
CHAR_CARET = "^"
CHAR_PIPE = "|"
CHAR_AMPERSAND = "&"

SPECIAL_CHAR_ARROW_RIGHT = "→"
SPECIAL_CHAR_ARROW_LEFT = "←"
SPECIAL_CHAR_ARROW_DOUBLE = "↔"
SPECIAL_CHAR_COPYRIGHT = "©"
SPECIAL_CHAR_UNREGISTERED_TRADEMARK = "™"
SPECIAL_CHAR_REGISTERED_TRADEMARK = "®"
# string defined
STR_CURSOR_POSITION = "cursor-position"
STR_STOCK_CT_IMP = "import_in_cherrytree"
STR_VISIBLE = "visible"
STR_UTF8 = "utf-8"
STR_UTF16 = "utf-16"
STR_IGNORE = "ignore"
STR_RETURN = "Return"
STR_PYGTK_222_REQUIRED = "PyGTK 2.22 required"
# html
HTML_HEADER = '<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>%s</title><meta name="generator" content="CherryTree"></head><body>'
HTML_FOOTER = '</body></html>'

STOCKS_N_FILES = [
    'node_bullet.png', 'node_no_icon.png', 'cherry_black.png', 'cherry_blue.png',
    'cherry_cyan.png', 'cherry_green.png', 'cherry_gray.png', 'cherry_orange.png',
    'cherry_orange_dark.png', 'cherry_purple.png', 'cherry_red.png', 'cherry_sherbert.png',
    'cherry_yellow.png', 'image_insert.png', 'image_edit.png', 'image_save.png',
    'table_insert.png', 'table_edit.png', 'table_save.png', 'codebox_insert.png',
    'codebox_edit.png', 'anchor_insert.png', 'anchor_edit.png', 'anchor.png',
    'insert.png', 'link_handle.png', 'link_website.png', 'cherry_edit.png',
    'list_bulleted.png', 'list_numbered.png', 'list_todo.png', 'node_name_header.png',
    'case_toggle.png', 'case_upper.png', 'case_lower.png', 'edit-delete.png',
    'edit-copy.png', 'edit-cut.png', 'edit-paste.png', 'find.png',
    'find_again.png', 'find_back.png', 'find_replace.png', 'color_background.png',
    'color_foreground.png', 'format-text-large.png', 'format-text-large2.png', 'format-text-large3.png',
    'format-text-small.png', 'format-text-subscript.png', 'format-text-superscript.png', 'format-text-monospace.png',
    'format-text-strikethrough.png', 'format-text-underline.png', 'format-text-bold.png', 'format-text-italic.png',
    'format_text_latest.png', 'format_text_clear.png', 'format_text.png',
    'object-rotate-left.png', 'object-rotate-right.png',
    'to_pdf.png', 'to_txt.png', 'to_html.png', 'to_cherrytree.png', 'export_from_cherrytree.png',
    STR_STOCK_CT_IMP + '.png',
    'from_cherrytree.png', 'from_txt.png', 'from_html.png', 'cherrytree.png', 'quit-app.png',
    'new-instance.png', 'toolbar.png', 'cherries.png', 'tree-node-add.png',
    'tree-subnode-add.png', 'help-contents.png', 'index.png', 'timestamp.png',
    'calendar.png', 'horizontal_rule.png', 'file_icon.png']

NODES_STOCKS = [
    'node_bullet', 'node_no_icon', 'cherry_black',
    'cherry_blue', 'cherry_cyan', 'cherry_green',
    'cherry_gray', 'cherry_orange', 'cherry_orange_dark',
    'cherry_purple', 'cherry_red', 'cherry_sherbert',
    'cherry_yellow']

TABLE_NODE_CREATE = """CREATE TABLE node (
node_id INTEGER UNIQUE,
name TEXT,
txt TEXT,
syntax TEXT,
tags TEXT,
is_ro INTEGER,
is_richtxt INTEGER,
has_codebox INTEGER,
has_table INTEGER,
has_image INTEGER,
level INTEGER
)"""

TABLE_CODEBOX_CREATE = """CREATE TABLE codebox (
node_id INTEGER,
offset INTEGER,
justification TEXT,
txt TEXT,
syntax TEXT,
width INTEGER,
height INTEGER,
is_width_pix INTEGER,
do_highl_bra INTEGER,
do_show_linenum INTEGER
)"""

TABLE_TABLE_CREATE = """CREATE TABLE grid (
node_id INTEGER,
offset INTEGER,
justification TEXT,
txt TEXT,
col_min INTEGER,
col_max INTEGER
)"""

TABLE_IMAGE_CREATE = """CREATE TABLE image (
node_id INTEGER,
offset INTEGER,
justification TEXT,
anchor TEXT,
png BLOB,
filename TEXT,
link TEXT
)"""

TABLE_CHILDREN_CREATE = """CREATE TABLE children (
node_id INTEGER UNIQUE,
father_id INTEGER,
sequence INTEGER
)"""

TABLE_BOOKMARK_CREATE = """CREATE TABLE bookmark (
node_id INTEGER UNIQUE,
sequence INTEGER
)"""

# Original from Dieter Verfaillie https://github.com/dieterv/elib.intl/blob/master/lib/elib/intl/__init__.py
# List of ISO 639-1 and ISO 639-2 language codes: http://www.loc.gov/standards/iso639-2/
# List of known lcid's: http://www.microsoft.com/globaldev/reference/lcid-all.mspx
# List of known MUI packs: http://www.microsoft.com/globaldev/reference/win2k/setup/Langid.mspx
MICROSOFT_WINDOWS_LCID_to_ISO_LANG = \
    {
        1078: 'af',  # Afrikaans - South Africa
        1052: 'sq',  # Albanian - Albania
        1118: 'am',  # Amharic - Ethiopia
        1025: 'ar',  # Arabic - Saudi Arabia
        5121: 'ar',  # Arabic - Algeria
        15361: 'ar',  # Arabic - Bahrain
        3073: 'ar',  # Arabic - Egypt
        2049: 'ar',  # Arabic - Iraq
        11265: 'ar',  # Arabic - Jordan
        13313: 'ar',  # Arabic - Kuwait
        12289: 'ar',  # Arabic - Lebanon
        4097: 'ar',  # Arabic - Libya
        6145: 'ar',  # Arabic - Morocco
        8193: 'ar',  # Arabic - Oman
        16385: 'ar',  # Arabic - Qatar
        10241: 'ar',  # Arabic - Syria
        7169: 'ar',  # Arabic - Tunisia
        14337: 'ar',  # Arabic - U.A.E.
        9217: 'ar',  # Arabic - Yemen
        1067: 'hy',  # Armenian - Armenia
        1101: 'as',  # Assamese
        2092: 'az',  # Azeri (Cyrillic)
        1068: 'az',  # Azeri (Latin)
        1069: 'eu',  # Basque
        1059: 'be',  # Belarusian
        1093: 'bn',  # Bengali (India)
        2117: 'bn',  # Bengali (Bangladesh)
        5146: 'bs',  # Bosnian (Bosnia/Herzegovina)
        1026: 'bg',  # Bulgarian
        1109: 'my',  # Burmese
        1027: 'ca',  # Catalan
        1116: 'chr',  # Cherokee - United States
        2052: 'zh',  # Chinese - People's Republic of China
        4100: 'zh',  # Chinese - Singapore
        1028: 'zh',  # Chinese - Taiwan
        3076: 'zh',  # Chinese - Hong Kong SAR
        5124: 'zh',  # Chinese - Macao SAR
        1050: 'hr',  # Croatian
        4122: 'hr',  # Croatian (Bosnia/Herzegovina)
        1029: 'cs',  # Czech
        1030: 'da',  # Danish
        1125: 'dv',  # Divehi
        1043: 'nl',  # Dutch - Netherlands
        2067: 'nl',  # Dutch - Belgium
        1126: 'bin',  # Edo
        1033: 'en',  # English - United States
        2057: 'en',  # English - United Kingdom
        3081: 'en',  # English - Australia
        10249: 'en',  # English - Belize
        4105: 'en',  # English - Canada
        9225: 'en',  # English - Caribbean
        15369: 'en',  # English - Hong Kong SAR
        16393: 'en',  # English - India
        14345: 'en',  # English - Indonesia
        6153: 'en',  # English - Ireland
        8201: 'en',  # English - Jamaica
        17417: 'en',  # English - Malaysia
        5129: 'en',  # English - New Zealand
        13321: 'en',  # English - Philippines
        18441: 'en',  # English - Singapore
        7177: 'en',  # English - South Africa
        11273: 'en',  # English - Trinidad
        12297: 'en',  # English - Zimbabwe
        1061: 'et',  # Estonian
        1080: 'fo',  # Faroese
        1065: None,  # TODO: Farsi
        1124: 'fil',  # Filipino
        1035: 'fi',  # Finnish
        1036: 'fr',  # French - France
        2060: 'fr',  # French - Belgium
        11276: 'fr',  # French - Cameroon
        3084: 'fr',  # French - Canada
        9228: 'fr',  # French - Democratic Rep. of Congo
        12300: 'fr',  # French - Cote d'Ivoire
        15372: 'fr',  # French - Haiti
        5132: 'fr',  # French - Luxembourg
        13324: 'fr',  # French - Mali
        6156: 'fr',  # French - Monaco
        14348: 'fr',  # French - Morocco
        58380: 'fr',  # French - North Africa
        8204: 'fr',  # French - Reunion
        10252: 'fr',  # French - Senegal
        4108: 'fr',  # French - Switzerland
        7180: 'fr',  # French - West Indies
        1122: 'fy',  # Frisian - Netherlands
        1127: None,  # TODO: Fulfulde - Nigeria
        1071: 'mk',  # FYRO Macedonian
        2108: 'ga',  # Gaelic (Ireland)
        1084: 'gd',  # Gaelic (Scotland)
        1110: 'gl',  # Galician
        1079: 'ka',  # Georgian
        1031: 'de',  # German - Germany
        3079: 'de',  # German - Austria
        5127: 'de',  # German - Liechtenstein
        4103: 'de',  # German - Luxembourg
        2055: 'de',  # German - Switzerland
        1032: 'el',  # Greek
        1140: 'gn',  # Guarani - Paraguay
        1095: 'gu',  # Gujarati
        1128: 'ha',  # Hausa - Nigeria
        1141: 'haw',  # Hawaiian - United States
        1037: 'he',  # Hebrew
        1081: 'hi',  # Hindi
        1038: 'hu',  # Hungarian
        1129: None,  # TODO: Ibibio - Nigeria
        1039: 'is',  # Icelandic
        1136: 'ig',  # Igbo - Nigeria
        1057: 'id',  # Indonesian
        1117: 'iu',  # Inuktitut
        1040: 'it',  # Italian - Italy
        2064: 'it',  # Italian - Switzerland
        1041: 'ja',  # Japanese
        1099: 'kn',  # Kannada
        1137: 'kr',  # Kanuri - Nigeria
        2144: 'ks',  # Kashmiri
        1120: 'ks',  # Kashmiri (Arabic)
        1087: 'kk',  # Kazakh
        1107: 'km',  # Khmer
        1111: 'kok',  # Konkani
        1042: 'ko',  # Korean
        1088: 'ky',  # Kyrgyz (Cyrillic)
        1108: 'lo',  # Lao
        1142: 'la',  # Latin
        1062: 'lv',  # Latvian
        1063: 'lt',  # Lithuanian
        1086: 'ms',  # Malay - Malaysia
        2110: 'ms',  # Malay - Brunei Darussalam
        1100: 'ml',  # Malayalam
        1082: 'mt',  # Maltese
        1112: 'mni',  # Manipuri
        1153: 'mi',  # Maori - New Zealand
        1102: 'mr',  # Marathi
        1104: 'mn',  # Mongolian (Cyrillic)
        2128: 'mn',  # Mongolian (Mongolian)
        1121: 'ne',  # Nepali
        2145: 'ne',  # Nepali - India
        1044: 'no',  # Norwegian (Bokmal)
        2068: 'no',  # Norwegian (Nynorsk)
        1096: 'or',  # Oriya
        1138: 'om',  # Oromo
        1145: 'pap',  # Papiamentu
        1123: 'ps',  # Pashto
        1045: 'pl',  # Polish
        1046: 'pt',  # Portuguese - Brazil
        2070: 'pt',  # Portuguese - Portugal
        1094: 'pa',  # Punjabi
        2118: 'pa',  # Punjabi (Pakistan)
        1131: 'qu',  # Quecha - Bolivia
        2155: 'qu',  # Quecha - Ecuador
        3179: 'qu',  # Quecha - Peru
        1047: 'rm',  # Rhaeto-Romanic
        1048: 'ro',  # Romanian
        2072: 'ro',  # Romanian - Moldava
        1049: 'ru',  # Russian
        2073: 'ru',  # Russian - Moldava
        1083: 'se',  # Sami (Lappish)
        1103: 'sa',  # Sanskrit
        1132: 'nso',  # Sepedi
        3098: 'sr',  # Serbian (Cyrillic)
        2074: 'sr',  # Serbian (Latin)
        1113: 'sd',  # Sindhi - India
        2137: 'sd',  # Sindhi - Pakistan
        1115: 'si',  # Sinhalese - Sri Lanka
        1051: 'sk',  # Slovak
        1060: 'sl',  # Slovenian
        1143: 'so',  # Somali
        1070: 'wen',  # Sorbian
        3082: 'es',  # Spanish - Spain (Modern Sort)
        1034: 'es',  # Spanish - Spain (Traditional Sort)
        11274: 'es',  # Spanish - Argentina
        16394: 'es',  # Spanish - Bolivia
        13322: 'es',  # Spanish - Chile
        9226: 'es',  # Spanish - Colombia
        5130: 'es',  # Spanish - Costa Rica
        7178: 'es',  # Spanish - Dominican Republic
        12298: 'es',  # Spanish - Ecuador
        17418: 'es',  # Spanish - El Salvador
        4106: 'es',  # Spanish - Guatemala
        18442: 'es',  # Spanish - Honduras
        58378: 'es',  # Spanish - Latin America
        2058: 'es',  # Spanish - Mexico
        19466: 'es',  # Spanish - Nicaragua
        6154: 'es',  # Spanish - Panama
        15370: 'es',  # Spanish - Paraguay
        10250: 'es',  # Spanish - Peru
        20490: 'es',  # Spanish - Puerto Rico
        21514: 'es',  # Spanish - United States
        14346: 'es',  # Spanish - Uruguay
        8202: 'es',  # Spanish - Venezuela
        1072: None,  # TODO: Sutu
        1089: 'sw',  # Swahili
        1053: 'sv',  # Swedish
        2077: 'sv',  # Swedish - Finland
        1114: 'syr',  # Syriac
        1064: 'tg',  # Tajik
        1119: None,  # TODO: Tamazight (Arabic)
        2143: None,  # TODO: Tamazight (Latin)
        1097: 'ta',  # Tamil
        1092: 'tt',  # Tatar
        1098: 'te',  # Telugu
        1054: 'th',  # Thai
        2129: 'bo',  # Tibetan - Bhutan
        1105: 'bo',  # Tibetan - People's Republic of China
        2163: 'ti',  # Tigrigna - Eritrea
        1139: 'ti',  # Tigrigna - Ethiopia
        1073: 'ts',  # Tsonga
        1074: 'tn',  # Tswana
        1055: 'tr',  # Turkish
        1090: 'tk',  # Turkmen
        1152: 'ug',  # Uighur - China
        1058: 'uk',  # Ukrainian
        1056: 'ur',  # Urdu
        2080: 'ur',  # Urdu - India
        2115: 'uz',  # Uzbek (Cyrillic)
        1091: 'uz',  # Uzbek (Latin)
        1075: 've',  # Venda
        1066: 'vi',  # Vietnamese
        1106: 'cy',  # Welsh
        1076: 'xh',  # Xhosa
        1144: 'ii',  # Yi
        1085: 'yi',  # Yiddish
        1130: 'yo',  # Yoruba
        1077: 'zu'  # Zulu
    }
